/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import * as moment from 'moment';
import {Moment} from 'moment';

import {
  clusters,
  hosts,
  services,
  users,
  components,
  ucFirst,
  getRandomInt,
  getRandomElement,
  generateServiceLog,
  generateAuditLog,
  generateGraphData
} from './mock-data-common';
import Base = moment.unitOfTime.Base;

const currentTime: Moment = moment();

export const mockDataGet = {
  'login': {},
  'logout': {},

  'api/v1/audit/logs': function (query) {
    const list = [];
    const params = query.rawParams.split('&').reduce((currentObj, param) => {
      let [key, value] = param.split('=');
      switch (key) {
        case 'page':
        case 'pageSize':
        case 'startIndex':
          value = parseInt(value, 0);
          break;
        case 'from':
        case 'to':
          value = decodeURIComponent(value);
          value = moment(value);
          break;
        case 'userList':
          value = decodeURIComponent(value).split(',');
          break;
      }
      currentObj[key] = value;
      return currentObj;
    }, {});
    const pageSize = params.pageSize || 50;
    const intervalSteps = params.to.diff(params.from) / pageSize;
    const startTime = params.from.valueOf();
    for (let i = 0; i < pageSize; i += 1) {
      const defaults: {[key: string]: any} = {logtime: startTime + (i * intervalSteps)};
      list.push(generateAuditLog(defaults));
    }
    return {
      'startIndex': params.startIndex,
      'pageSize': pageSize,
      'totalCount': 10 * pageSize,
      'resultSize': 10 * pageSize,
      'sortType': params.sortType,
      'sortBy': params.sortBy,
      'queryTimeMS': 1518013198573,
      'logList': list
    };
  },
  'api/v1/audit/logs/bargraph': {
    graphData: [{
      dataCount: [
        {
          name: currentTime.toISOString(),
          value: '75'
        },
        {
          name: currentTime.clone().subtract(20, 'm').toISOString(),
          value: '100'
        },
        {
          name: currentTime.clone().subtract(40, 'm').toISOString(),
          value: '75'
        },
        {
          name: currentTime.clone().subtract(1, 'h').toISOString(),
          value: '50'
        }
      ],
      name: 'AMBARI'
    }, {
      dataCount: [
        {
          name: currentTime.toISOString(),
          value: '150'
        },
        {
          name: currentTime.clone().subtract(20, 'm').toISOString(),
          value: '50'
        },
        {
          name: currentTime.clone().subtract(40, 'm').toISOString(),
          value: '75'
        },
        {
          name: currentTime.clone().subtract(1, 'h').toISOString(),
          value: '100'
        }
      ],
      name: 'HDFS'
    }
  ]},
  'api/v1/audit/logs/components': {
    'groups': {},
    'metadata': components.map(comp => {
      return {
        name: comp,
        label: comp.split('_').map(ucFirst).join(' '),
        group: null
      };
    })
  },
  'api/v1/audit/logs/resources/\\d': function (query) {
    const graphData = users.map((user: string) => {
      return {
        name: user,
        dataCount: services.map((service: string) => {
          return {
            name: service,
            value: getRandomInt(1000)
          };
        })
      };
    });
    return {
      graphData: graphData
    };
  },
  'api/v1/audit/logs/schema/fields': {
    'defaults': [
      {
        'name': 'logType',
        'label': 'Log Type',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'cluster',
        'label': 'Cluster',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'reason',
        'label': 'Reason',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'agent',
        'label': 'Agent',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'access',
        'label': 'Access Type',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'dst',
        'label': 'DST',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'perm',
        'label': 'Perm',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'event_count',
        'label': 'Event Count',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'repo',
        'label': 'Repo',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'sess',
        'label': 'Session',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'reqUser',
        'label': 'User',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'task_id',
        'label': 'Task Id',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'type',
        'label': 'Type',
        'filterable': true,
        'visible': true
      },
      {
        'name': 'reqData',
        'label': 'Req Data',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'result',
        'label': 'Result',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'path',
        'label': 'Path',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'file',
        'label': 'File',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'ugi',
        'label': 'UGI',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'case_id',
        'label': 'Case Id',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'host',
        'label': 'Host',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'action',
        'label': 'Action',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'log_message',
        'label': 'Log Message',
        'filterable': true,
        'visible': true
      },
      {
        'name': 'agentHost',
        'label': 'Agent Host',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'id',
        'label': 'Id',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'logger_name',
        'label': 'Logger Name',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'text',
        'label': 'Text',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'authType',
        'label': 'Auth Type',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'logfile_line_number',
        'label': 'Logfile Line Number',
        'filterable': true,
        'visible': true
      },
      {
        'name': 'policy',
        'label': 'Policy',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'cliIP',
        'label': 'Client Ip',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'level',
        'label': 'Level',
        'filterable': true,
        'visible': true
      },
      {
        'name': 'resource',
        'label': 'Resource',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'resType',
        'label': 'Res Type',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'ip',
        'label': 'IP',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'evtTime',
        'label': 'Event Time',
        'filterable': true,
        'visible': true
      },
      {
        'name': 'req_self_id',
        'label': 'Req Self Id',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'repoType',
        'label': 'Repo Type',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'req_caller_id',
        'label': 'Req Caller Id',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'enforcer',
        'label': 'Access Enforcer',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'bundle_id',
        'label': 'Bundle Id',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'cliType',
        'label': 'Client Type',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'reqContext',
        'label': 'Req Context',
        'filterable': true,
        'visible': false
      },
      {
        'name': 'proxyUsers',
        'label': 'Proxy Users',
        'filterable': true,
        'visible': false
      }
    ],
    'overrides': {
      'ambari': [
        {
          'name': 'logType',
          'label': 'Log Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cluster',
          'label': 'Cluster',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reason',
          'label': 'Reason',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'agent',
          'label': 'Agent',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'access',
          'label': 'Access',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'dst',
          'label': 'Dst',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'perm',
          'label': 'Perm',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'event_count',
          'label': 'Event Count',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'repo',
          'label': 'Repo',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'sess',
          'label': 'Sess',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqUser',
          'label': 'Req User',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'task_id',
          'label': 'Task Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'type',
          'label': 'Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqData',
          'label': 'Req Data',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'result',
          'label': 'Result',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'path',
          'label': 'Path',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'file',
          'label': 'File',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'ugi',
          'label': 'Ugi',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'case_id',
          'label': 'Case Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'host',
          'label': 'Host',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'action',
          'label': 'Action',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'log_message',
          'label': 'Log Message',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'agentHost',
          'label': 'Agent Host',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'id',
          'label': 'Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'logger_name',
          'label': 'Logger Name',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'text',
          'label': 'Text',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'authType',
          'label': 'Auth Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'logfile_line_number',
          'label': 'Logfile Line Number',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'policy',
          'label': 'Policy',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cliIP',
          'label': 'Cli I P',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'level',
          'label': 'Level',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'resource',
          'label': 'Resource',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'resType',
          'label': 'Res Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'ip',
          'label': 'Ip',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'evtTime',
          'label': 'Evt Time',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'req_self_id',
          'label': 'Req Self Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'repoType',
          'label': 'Repo Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'req_caller_id',
          'label': 'Req Caller Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'enforcer',
          'label': 'Enforcer',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'bundle_id',
          'label': 'Bundle Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cliType',
          'label': 'Cli Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqContext',
          'label': 'Req Context',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'proxyUsers',
          'label': 'Proxy Users',
          'filterable': true,
          'visible': false
        }
      ],
      'RangerAudit': [
        {
          'name': 'logType',
          'label': 'Log Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cluster',
          'label': 'Cluster',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reason',
          'label': 'Reason',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'agent',
          'label': 'Agent',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'access',
          'label': 'Access',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'dst',
          'label': 'Dst',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'perm',
          'label': 'Perm',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'event_count',
          'label': 'Event Count',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'repo',
          'label': 'Repo',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'sess',
          'label': 'Sess',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqUser',
          'label': 'Req User',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'task_id',
          'label': 'Task Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'type',
          'label': 'Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqData',
          'label': 'Req Data',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'result',
          'label': 'Result',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'path',
          'label': 'Path',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'file',
          'label': 'File',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'ugi',
          'label': 'Ugi',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'case_id',
          'label': 'Case Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'host',
          'label': 'Host',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'action',
          'label': 'Action',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'log_message',
          'label': 'Log Message',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'agentHost',
          'label': 'Agent Host',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'id',
          'label': 'Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'logger_name',
          'label': 'Logger Name',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'text',
          'label': 'Text',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'authType',
          'label': 'Auth Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'logfile_line_number',
          'label': 'Logfile Line Number',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'policy',
          'label': 'Policy',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cliIP',
          'label': 'Cli I P',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'level',
          'label': 'Level',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'resource',
          'label': 'Resource',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'resType',
          'label': 'Res Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'ip',
          'label': 'Ip',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'evtTime',
          'label': 'Evt Time',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'req_self_id',
          'label': 'Req Self Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'repoType',
          'label': 'Repo Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'req_caller_id',
          'label': 'Req Caller Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'enforcer',
          'label': 'Enforcer',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'bundle_id',
          'label': 'Bundle Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cliType',
          'label': 'Cli Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqContext',
          'label': 'Req Context',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'proxyUsers',
          'label': 'Proxy Users',
          'filterable': true,
          'visible': false
        }
      ],
      'hdfs': [
        {
          'name': 'logType',
          'label': 'Log Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cluster',
          'label': 'Cluster',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reason',
          'label': 'Reason',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'agent',
          'label': 'Agent',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'access',
          'label': 'Access',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'dst',
          'label': 'Dst',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'perm',
          'label': 'Perm',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'event_count',
          'label': 'Event Count',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'repo',
          'label': 'Repo',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'sess',
          'label': 'Sess',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqUser',
          'label': 'Req User',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'task_id',
          'label': 'Task Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'type',
          'label': 'Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqData',
          'label': 'Req Data',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'result',
          'label': 'Result',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'path',
          'label': 'Path',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'file',
          'label': 'File',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'ugi',
          'label': 'Ugi',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'case_id',
          'label': 'Case Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'host',
          'label': 'Host',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'action',
          'label': 'Action',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'log_message',
          'label': 'Log Message',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'agentHost',
          'label': 'Agent Host',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'id',
          'label': 'Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'logger_name',
          'label': 'Logger Name',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'text',
          'label': 'Text',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'authType',
          'label': 'Auth Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'logfile_line_number',
          'label': 'Logfile Line Number',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'policy',
          'label': 'Policy',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cliIP',
          'label': 'Cli I P',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'level',
          'label': 'Level',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'resource',
          'label': 'Resource',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'resType',
          'label': 'Res Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'ip',
          'label': 'Ip',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'evtTime',
          'label': 'Evt Time',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'req_self_id',
          'label': 'Req Self Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'repoType',
          'label': 'Repo Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'req_caller_id',
          'label': 'Req Caller Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'enforcer',
          'label': 'Enforcer',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'bundle_id',
          'label': 'Bundle Id',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'cliType',
          'label': 'Cli Type',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'reqContext',
          'label': 'Req Context',
          'filterable': true,
          'visible': false
        },
        {
          'name': 'proxyUsers',
          'label': 'Proxy Users',
          'filterable': true,
          'visible': false
        }
      ]
    }
  },
  'api/v1/audit/logs/serviceload': {
    graphData: [
      {
        dataCount: [
          {
            name: 'n4',
            value: 1
          },
          {
            name: 'n5',
            value: 2
          }
        ],
        name: 'graph2'
      },
      {
        dataCount: [
          {
            name: 'n6',
            value: 10
          },
          {
            name: 'n7',
            value: 20
          }
        ],
        name: 'graph3'
      }
    ]
  },

  'api/v1/public/config': {},

  'api/v1/service/logs': function (query) {
    const list = [];
    const params = query.rawParams.split('&').reduce((currentObj, param) => {
      let [key, value] = param.split('=');
      switch (key) {
        case 'page':
        case 'pageSize':
        case 'startIndex':
          value = parseInt(value, 0);
          break;
        case 'from':
        case 'to':
          value = decodeURIComponent(value);
          value = moment(value);
          break;
        case 'mustBe':
        case 'hostList':
        case 'level':
          value = decodeURIComponent(value).split(',');
          break;
      }
      currentObj[key] = value;
      return currentObj;
    }, {});
    const pageSize = params.pageSize || 50;
    const intervalSteps = params.to.diff(params.from) / pageSize;
    const startTime = params.from.valueOf();

    for (let i = 0; i < pageSize; i += 1) {
      const defaults: {[key: string]: any} = {logtime: startTime + (i * intervalSteps)};
      if (params.mustBe) {
        defaults.type = getRandomElement(params.mustBe);
      }
      if (params.hostList) {
        defaults.host = getRandomElement(params.hostList);
      }
      if (params.level) {
        defaults.level = getRandomElement(params.level);
      }
      list.push(generateServiceLog(defaults));
    }
    return {
      'startIndex': params.startIndex,
      'pageSize': pageSize,
      'totalCount': 10 * pageSize,
      'resultSize': 10 * pageSize,
      'sortType': params.sortType,
      'sortBy': params.sortBy,
      'queryTimeMS': 1518013198573,
      'logList': list
    };
  },
  'api/v1/service/logs/logList': (query) => {
    const list = [];
    const params = query.rawParams.split('&').reduce((currentObj, param) => {
      let [key, value] = param.split('=');
      switch (key) {
        case 'page':
        case 'pageSize':
        case 'startIndex':
          value = parseInt(value, 0);
          break;
        case 'from':
        case 'to':
          value = decodeURIComponent(value);
          value = moment(value);
          break;
        case 'mustBe':
        case 'hostList':
        case 'level':
          value = decodeURIComponent(value).split(',');
          break;
      }
      currentObj[key] = value;
      return currentObj;
    }, {});
    const pageSize = params.pageSize || 50;
    const intervalSteps = params.to.diff(params.from) / pageSize;
    const startTime = params.from.valueOf();

    for (let i = 0; i < pageSize; i += 1) {
      const defaults: {[key: string]: any} = {
        logtime: startTime + (i * intervalSteps),
        event_dur_ms: getRandomInt(1000)
      };
      if (params.mustBe) {
        defaults.type = getRandomElement(params.mustBe);
      }
      if (params.hostList) {
        defaults.host = getRandomElement(params.hostList);
      }
      if (params.level) {
        defaults.level = getRandomElement(params.level);
      }
      list.push(generateServiceLog(defaults));
    }
    return list;
  },
  'api/v1/service/logs/aggregated': {
    graphData: [
      {
        name: 'n0',
        count: 100,
        dataList: [
          {
            name: 'n1',
            count: 50,
            dataList: null
          },
          {
            name: 'n2',
            count: 200,
            dataList: null
          }
        ]
      },
      {
        name: 'n3',
        count: 10,
        dataList: [
          {
            name: 'n4',
            count: 5,
            dataList: null
          },
          {
            name: 'n5',
            count: 20,
            dataList: null
          }
        ]
      }
    ]
  },
  'api/v1/service/logs/components': {
    'groups': {},
    'metadata': components.map(comp => {
      return {
        name: comp,
        label: comp.split('_').map(ucFirst).join(' '),
        group: null
      };
    })
  },
  'api/v1/service/logs/components/levels/counts': {
    vNodeList: [
      {
        name: 'ambari',
        type: 0,
        logLevelCount: [
          {
            name: 'ERROR',
            value: '10'
          },
          {
            name: 'WARN',
            value: '50'
          }
        ],
        childs: [
          {
            name: 'hdfs',
            type: 2,
            logLevelCount: [
              {
                name: 'ERROR',
                value: '10'
              },
              {
                name: 'WARN',
                value: '20'
              }
            ],
            isParent: false,
            isRoot: false
          },
          {
            name: 'zookeeper',
            type: 3,
            logLevelCount: [
              {
                name: 'ERROR',
                value: '20'
              },
              {
                name: 'WARN',
                value: '40'
              }
            ],
            isParent: false,
            isRoot: false
          }
        ],
        isParent: true,
        isRoot: false
      },
      {
        name: 'ambari_agent',
        type: 1,
        logLevelCount: [
          {
            name: 'ERROR',
            value: '100'
          },
          {
            name: 'WARN',
              value: '500'
          }
        ],
        isParent: false,
        isRoot: false
      }
    ]
  },
  'api/v1/service/logs/files': {
    hostLogFiles: {
      clusters: clusters,
      services: services
    }
  },
  'api/v1/service/logs/histogram': (query: URLSearchParams) => {
    const unitParam: string[] = decodeURIComponent(query.get('unit')).match(/(\d{1,})([a-zA-Z]{1,})/);
    const unit: Base = <Base>unitParam[2];
    const amount: number = parseInt(unitParam[1], 0);
    const from = moment(decodeURIComponent(query.get('from')));
    const to = moment(decodeURIComponent(query.get('to')));
    return {
      graphData: generateGraphData(from, to, unit, amount)
    };
  },
  'api/v1/service/logs/hosts': {
    groupList: hosts.map(host => Object.assign({}, {host}))
  },
  'api/v1/service/logs/schema/fields': [{
    'name': 'cluster',
    'label': 'Cluster',
    'filterable': true,
    'visible': false
  }, {
    'name': 'key_log_message',
    'label': 'Key Log Message',
    'filterable': true,
    'visible': false
  }, {
    'name': 'type',
    'label': 'Component',
    'filterable': true,
    'visible': true
  }, {
    'name': 'path',
    'label': 'Path',
    'filterable': true,
    'visible': false
  }, {
    'name': 'logtype',
    'label': 'Logtype',
    'filterable': true,
    'visible': false
  }, {
    'name': 'file',
    'label': 'File',
    'filterable': true,
    'visible': false
  }, {
    'name': 'line_number',
    'label': 'Line Number',
    'filterable': true,
    'visible': true
  }, {
    'name': 'host',
    'label': 'Host',
    'filterable': true,
    'visible': false
  }, {
    'name': 'log_message',
    'label': 'Message',
    'filterable': true,
    'visible': true
  }, {
    'name': 'logger_name',
    'label': 'Logger Name',
    'filterable': true,
    'visible': false
  }, {
    'name': 'logfile_line_number',
    'label': 'Logfile Line Number',
    'filterable': true,
    'visible': false
  }, {
    'name': 'group',
    'label': 'Group',
    'filterable': true,
    'visible': false
  }, {
    'name': 'method',
    'label': 'Method',
    'filterable': true,
    'visible': false
  }, {
    'name': 'level',
    'label': 'Level',
    'filterable': true,
    'visible': true
  }, {
    'name': 'ip',
    'label': 'Ip',
    'filterable': true,
    'visible': false
  }, {
    'name': 'thread_name',
    'label': 'Thread',
    'filterable': true,
    'visible': false
  }, {
    'name': 'logtime',
    'label': 'Log Time',
    'filterable': true,
    'visible': true
  }],
  'api/v1/service/logs/serviceconfig': '',
  'api/v1/service/logs/tree': {
    vNodeList: [
      {
        name: hosts[0],
        type: 'H',
        value: '1',
        childs: [
          {
            name: 'ams_collector',
            type: 'C',
            value: '1',
            logLevelCount: [
              {
                name: 'WARN',
                value: '1'
              }
            ],
            isParent: false,
            isRoot: false
          }
        ],
        logLevelCount: [
          {
            name: 'WARN',
            value: '1'
          }
        ],
        isParent: true,
        isRoot: true
      },
      {
        name: hosts[1],
        type: 'H',
        value: '6',
        childs: [
          {
            name: 'ams_collector',
            type: 'C',
            value: '1',
            logLevelCount: [
              {
                name: 'ERROR',
                value: '1'
              }
            ],
            isParent: false,
            isRoot: false
          },
          {
            name: 'ambari_agent',
            type: 'C',
            value: '1',
            logLevelCount: [
              {
                name: 'FATAL',
                value: '1'
              }
            ],
            isParent: false,
            isRoot: false
          },
          {
            name: 'zookeeper_server',
            type: 'C',
            value: '2',
            logLevelCount: [
              {
                name: 'INFO',
                value: '1'
              },
              {
                name: 'DEBUG',
                value: '1'
              }
            ],
            isParent: false,
            isRoot: false
          },
          {
            name: 'zookeeper_client',
            type: 'C',
            value: '2',
            logLevelCount: [
              {
                name: 'TRACE',
                value: '1'
              },
              {
                name: 'UNKNOWN',
                value: '1'
              }
            ],
            isParent: false,
            isRoot: false
          }
        ],
        logLevelCount: [
          {
            name: 'ERROR',
            value: '1'
          },
          {
            name: 'FATAL',
            value: '1'
          },
          {
            name: 'INFO',
            value: '1'
          },
          {
            name: 'DEBUG',
            value: '1'
          },
          {
            name: 'TRACE',
            value: '1'
          },
          {
            name: 'UNKNOWN',
            value: '1'
          }
        ],
        isParent: true,
        isRoot: true
      }
    ]
  },
  'api/v1/service/logs/truncated': {
    logList: [
      {
        path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
        host: 'h0',
        level: 'WARN',
        logtime: '2017-05-28T11:30:22.531Z',
        ip: '192.168.0.1',
        logfile_line_number: 8,
        type: 'ams_collector',
        _version_: 9,
        id: 'id2',
        file: 'ambari-metrics-collector.log',
        seq_num: 10,
        bundle_id: 'b2',
        case_id: 'c2',
        log_message: 'Connection refused',
        message_md5: '1357908642',
        cluster: 'cl2',
        event_count: 5,
        event_md5: '1908755391',
        event_dur_ms: 200,
        _ttl_: '+5DAYS',
        _expire_at_: '2017-05-29T11:30:22.531Z',
        _router_field_: 20
      },
      {
        path: '/var/log/ambari-metrics-collector/ambari-metrics-collector.log',
        host: 'h1',
        level: 'ERROR',
        logtime: '2017-05-28T10:30:22.531Z',
        ip: '192.168.0.2',
        type: 'ams_collector',
        _version_: 14,
        id: 'id3',
        file: 'ambari-metrics-collector.log',
        seq_num: 15,
        bundle_id: 'b3',
        case_id: 'c3',
        log_message: 'Connection refused',
        logfile_line_number: 16,
        message_md5: '1357908642',
        cluster: 'cl3',
        event_count: 2,
        event_md5: '1029384756',
        event_dur_ms: 700,
        _ttl_: '+5DAYS',
        _expire_at_: '2017-05-29T10:30:22.531Z',
        _router_field_: 5
      }
    ]
  },
  'api/v1/service/logs/clusters': clusters,

  'api/v1/status': {
    auditlogs: {
      znodeReady: true,
      solrCollectionReady: true,
      solrAliasReady: false,
      configurationUploaded: true
    },
    servicelogs: {
      znodeReady: true,
      solrCollectionReady: true,
      configurationUploaded: true
    },
    userconfig: {
      znodeReady: true,
      solrCollectionReady: true,
      configurationUploaded: true
    }
  },
  'api/v1/shipper/filters/\[a-zA-Z0-9\]{1,}/level': {
    'filter': {
      'ambari_agent': {
        'label': 'ambari_agent',
        'hosts': [],
        'defaultLevels': [
          'FATAL',
          'ERROR',
          'WARN'
        ],
        'overrideLevels': [],
        'expiryTime': null
      },
      'ambari_alerts': {
        'label': 'ambari_alerts',
        'hosts': [],
        'defaultLevels': [
          'FATAL',
          'ERROR',
          'WARN'
        ],
        'overrideLevels': [],
        'expiryTime': null
      },
      'ambari_server': {
        'label': 'ambari_server',
        'hosts': [],
        'defaultLevels': [
          'FATAL',
          'ERROR',
          'WARN'
        ],
        'overrideLevels': [],
        'expiryTime': null
      },
      'ams_collector': {
        'label': 'ams_collector',
        'hosts': [],
        'defaultLevels': [
          'FATAL',
          'ERROR',
          'WARN'
        ],
        'overrideLevels': [],
        'expiryTime': null
      },
      'ams_hbase_master': {
        'label': 'ams_hbase_master',
        'hosts': [],
        'defaultLevels': [
          'FATAL',
          'ERROR',
          'WARN'
        ],
        'overrideLevels': [],
        'expiryTime': null
      },
      'ams_monitor': {
        'label': 'ams_monitor',
        'hosts': [],
        'defaultLevels': [
          'FATAL',
          'ERROR',
          'WARN'
        ],
        'overrideLevels': [],
        'expiryTime': null
      },
      'logsearch_app': {
        'label': 'logsearch_app',
        'hosts': [],
        'defaultLevels': [
          'FATAL',
          'ERROR',
          'WARN'
        ],
        'overrideLevels': [],
        'expiryTime': null
      },
      'logsearch_feeder': {
        'label': 'logsearch_feeder',
        'hosts': [],
        'defaultLevels': [
          'FATAL',
          'ERROR',
          'WARN'
        ],
        'overrideLevels': [],
        'expiryTime': null
      }
    }
  },
  'api/v1/shipper/input/[a-zA-Z0-9]{1,}/services$': [
    'zookeeper',
    'ambari-infra',
    'logsearch',
    'ambari',
    'ambari-metrics',
    'hdfs'
  ],
  'api/v1/shipper/input/[a-zA-Z0-9\\-]{1,}/services/[a-zA-Z0-9\\-]{1,}$': {
    'input': [
      {
        'type': 'hdfs_datanode',
        'rowtype': 'service',
        'path': '/var/log/hadoop/hdfs/hadoop-hdfs-datanode-*.log'
      },
      {
        'type': 'hdfs_namenode',
        'rowtype': 'service',
        'path': '/var/log/hadoop/hdfs/hadoop-hdfs-namenode-*.log'
      },
      {
        'type': 'hdfs_journalnode',
        'rowtype': 'service',
        'path': '/var/log/hadoop/hdfs/hadoop-hdfs-journalnode-*.log'
      },
      {
        'type': 'hdfs_secondarynamenode',
        'rowtype': 'service',
        'path': '/var/log/hadoop/hdfs/hadoop-hdfs-secondarynamenode-*.log'
      },
      {
        'type': 'hdfs_zkfc',
        'rowtype': 'service',
        'path': '/var/log/hadoop/hdfs/hadoop-hdfs-zkfc-*.log'
      },
      {
        'type': 'hdfs_nfs3',
        'rowtype': 'service',
        'path': '/var/log/hadoop/hdfs/hadoop-hdfs-nfs3-*.log'
      },
      {
        'type': 'hdfs_audit',
        'rowtype': 'audit',
        'path': '/var/log/hadoop/hdfs/hdfs-audit.log',
        'add_fields': {
          'logType': 'HDFSAudit',
          'enforcer': 'hadoop-acl',
          'repoType': '1',
          'repo': 'hdfs'
        },
        'is_enabled': true
      }
    ],
    'filter': [
      {
        'filter': 'grok',
        'conditions': {
          'fields': {
            'type': [
              'hdfs_datanode',
              'hdfs_journalnode',
              'hdfs_secondarynamenode',
              'hdfs_namenode',
              'hdfs_zkfc',
              'hdfs_nfs3'
            ]
          }
        },
        'post_map_values': {
          'logtime': [
            {
              'map_date': {
                'target_date_pattern': 'yyyy-MM-dd HH:mm:ss,SSS'
              }
            }
          ]
        },
        'log4j_format': '%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n',
        'multiline_pattern': '^(%{TIMESTAMP_ISO8601:logtime})',
        'message_pattern': '(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:logger_name}%{SPACE}\\(%{JAVAFILE:file}:%{JAVAMETHOD:method}\\(%{INT:line_number}\\)\\)%{SPACE}-%{SPACE}%{GREEDYDATA:log_message}'
      },
      {
        'filter': 'grok',
        'conditions': {
          'fields': {
            'type': [
              'hdfs_audit'
            ]
          }
        },
        'post_map_values': {
          'evtTime': [
            {
              'map_date': {
                'target_date_pattern': 'yyyy-MM-dd HH:mm:ss,SSS'
              }
            }
          ]
        },
        'log4j_format': '%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n',
        'multiline_pattern': '^(%{TIMESTAMP_ISO8601:evtTime})',
        'message_pattern': '(?m)^%{TIMESTAMP_ISO8601:evtTime}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:logger_name}:%{SPACE}%{GREEDYDATA:log_message}'
      },
      {
        'filter': 'keyvalue',
        'conditions': {
          'fields': {
            'type': [
              'hdfs_audit'
            ]
          }
        },
        'sort_order': 1,
        'source_field': 'log_message',
        'post_map_values': {
          'callerContext': [
            {
              'map_field_name': {
                'new_field_name': 'req_caller_id'
              }
            }
          ],
          'src': [
            {
              'map_field_name': {
                'new_field_name': 'resource'
              }
            }
          ],
          'allowed': [
            {
              'map_field_value': {
                'pre_value': 'true',
                'post_value': '1'
              }
            },
            {
              'map_field_value': {
                'pre_value': 'false',
                'post_value': '0'
              }
            },
            {
              'map_field_name': {
                'new_field_name': 'result'
              }
            }
          ],
          'ip': [
            {
              'map_field_name': {
                'new_field_name': 'cliIP'
              }
            }
          ],
          'proto': [
            {
              'map_field_name': {
                'new_field_name': 'cliType'
              }
            }
          ],
          'cmd': [
            {
              'map_field_name': {
                'new_field_name': 'action'
              }
            }
          ]
        },
        'field_split': '\t',
        'value_split': '='
      },
      {
        'filter': 'grok',
        'conditions': {
          'fields': {
            'type': [
              'hdfs_audit'
            ]
          }
        },
        'sort_order': 2,
        'source_field': 'ugi',
        'remove_source_field': false,
        'post_map_values': {
          'k_authType': [
            {
              'map_field_name': {
                'new_field_name': 'proxyAuthType'
              }
            }
          ],
          'p_authType': [
            {
              'map_field_name': {
                'new_field_name': 'authType'
              }
            }
          ],
          'x_user': [
            {
              'map_field_name': {
                'new_field_name': 'reqUser'
              }
            }
          ],
          'k_user': [
            {
              'map_field_name': {
                'new_field_name': 'proxyUsers'
              }
            }
          ],
          'p_user': [
            {
              'map_field_name': {
                'new_field_name': 'reqUser'
              }
            }
          ],
          'user': [
            {
              'map_field_name': {
                'new_field_name': 'reqUser'
              }
            }
          ]
        },
        'message_pattern': '%{USERNAME:p_user}.+auth:%{USERNAME:p_authType}.+via %{USERNAME:k_user}.+auth:%{USERNAME:k_authType}|%{USERNAME:user}.+auth:%{USERNAME:authType}|%{USERNAME:x_user}'
      }
    ]
  }
};
